/*******************************************************************************
  * 文件：KeyDispatch.c
  * 作者：zyz
  * 版本：v1.0.0
  * 日期：2017-08-03
  * 说明：按键分发
*******************************************************************************/

/* 头文件 *********************************************************************/
#include "KeyDispatch.h"
#include "KeyHandler.h"
#include "Macro.h"
#include "main.h"
#include "DevState.h"

/* 宏定义 *********************************************************************/
/* 类型定义 *******************************************************************/
/* 变量定义 *******************************************************************/
// 按键回调函数表
static const KeyHandler_ts asHandlerTab[] = 
{
    // 电源键长按1.5S处理
    {u32KEY_VALUE_POWER,        eKEY_TYPE_HOLD_1500MS,            Key_PowerLongPressHandler       },

    // S1键长按
    {u32KEY_VALUE_S1,           eKEY_TYPE_HOLD_1500MS,            Key_S1LongPressHandler          },
    
    // Warm键短按处理
    {u32KEY_VALUE_WARM,         eKEY_TYPE_PRESS_DOWN,             Key_WarmPressHandler            },
    
    // Boost键短按处理
    {u32KEY_VALUE_BOOST,        eKEY_TYPE_PRESS_DOWN,             Key_BoostPressHandler           },  
    
    // Pause键短按处理
    {u32KEY_VALUE_PAUSE,        eKEY_TYPE_PRESS_DOWN,             Key_PausePressHandler           },
    
    // Ho1键短按处理
    {u32KEY_VALUE_HOB1,         eKEY_TYPE_PRESS_DOWN,             Key_Hob1PressHandler            }, 

    // Ho2键短按处理
    {u32KEY_VALUE_HOB2,         eKEY_TYPE_PRESS_DOWN,             Key_Hob2PressHandler            }, 
    
    // Ho3键短按处理
    {u32KEY_VALUE_HOB3,         eKEY_TYPE_PRESS_DOWN,             Key_Hob3PressHandler            }, 
    
    // Ho4键短按处理
    {u32KEY_VALUE_HOB4,         eKEY_TYPE_PRESS_DOWN,             Key_Hob4PressHandler            }, 

    // Ho1键长按处理
    {u32KEY_VALUE_HOB1,         eKEY_TYPE_HOLD_2S,                Key_Hob1LongPressHandler        }, 

    // Ho2键长按处理
    {u32KEY_VALUE_HOB2,         eKEY_TYPE_HOLD_2S,                Key_Hob2LongPressHandler        }, 
    
    // Ho3键长按处理
    {u32KEY_VALUE_HOB3,         eKEY_TYPE_HOLD_2S,                Key_Hob3LongPressHandler        }, 
    
    // Ho4键长按处理
    {u32KEY_VALUE_HOB4,         eKEY_TYPE_HOLD_2S,                Key_Hob4LongPressHandler        }, 
    
    // ADD键短按处理
    {u32KEY_VALUE_ADD,          eKEY_TYPE_PRESS_DOWN,             Key_AddPressHandler             }, 
    
    // Sub键短按处理
    {u32KEY_VALUE_SUB,          eKEY_TYPE_PRESS_DOWN,             Key_SubPressHandler             }, 
    
    // ADD键连按处理
    {u32KEY_VALUE_ADD,          eKEY_TYPE_CONTINUE,               Key_AddContinuePressHandler     }, 
    
    // Sub键连按处理
    {u32KEY_VALUE_SUB,          eKEY_TYPE_CONTINUE,               Key_SubContinuePressHandler     }, 

    // ADD and Sub键短按处理
    {u32KEY_VALUE_ADD_SUB,      eKEY_TYPE_PRESS_UP,               Key_LockShortPressHandler       }, 

    // ADD and Sub键长按处理
    {u32KEY_VALUE_ADD_SUB,      eKEY_TYPE_HOLD_3S,                Key_LockLongPressHandler        }, 
};

// 滑条按键值表
static const KeySlider_ts asKeyValueSliderTab[] = 
{
    // 滑条1档对应键值
    {u32KEY_VALUE_S1,           1},
    {u32KEY_VALUE_S1_S2,        1},
    
    // 滑条2档对应键值
    {u32KEY_VALUE_S2,           2},
    {u32KEY_VALUE_S2_S3,        2},
    
    // 滑条3档对应键值
    {u32KEY_VALUE_S3,           3},
    {u32KEY_VALUE_S3_S4,        3},
    
    // 滑条4档对应键值
    {u32KEY_VALUE_S4,           4},
    {u32KEY_VALUE_S4_S5,        4},
    
    // 滑条5档对应键值
    {u32KEY_VALUE_S5,           5},
    {u32KEY_VALUE_S5_S6,        5},
    
    // 滑条6档对应键值
    {u32KEY_VALUE_S6,           6},
    {u32KEY_VALUE_S6_S7,        6},
    
    // 滑条7档对应键值
    {u32KEY_VALUE_S7,           7},
    {u32KEY_VALUE_S7_S8,        7},
    
    // 滑条8档对应键值
    {u32KEY_VALUE_S8,           8},
    {u32KEY_VALUE_S8_S9,        8},
    
    // 滑条9档对应键值
    {u32KEY_VALUE_S9,           9},
};
/* 函数声明 *******************************************************************/
/* 函数定义 *******************************************************************/

/*******************************************************************************
  * 函数名: void Key_DispatchHandler(U16 u16Value, KeyType_te eType)
  * 功  能：查找处理函数
  * 参  数：U32 u16Value     - 按键值
  *        KeyType_te eType - 按键操作类型
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Key_DispatchHandler(U32 u32Value, KeyType_te eType)
{
    U8 u8Index = 0;
    // 按键回调函数个数
    static U8 u8HandlerNum = (U8)(ARRAY_SIZE(asHandlerTab));

    // 查找处理函数
    for(u8Index=0; u8Index<u8HandlerNum; u8Index++)
    {
        if((asHandlerTab[u8Index].u16KeyValue == u32Value) &&
           (asHandlerTab[u8Index].eKeyType == eType) &&
           (asHandlerTab[u8Index].pfHandler != NULL))
        {
            // 找到处理函数且函数指针有效，则进行处理
            asHandlerTab[u8Index].pfHandler();
            break;
        }
    }
}

/*******************************************************************************
  * 函数名: Key_SliderCheck
  * 功  能：滑条检测
  * 参  数：无
  * 返回值：无
  * 说  明：按键短按时，先检测是否为滑条中的按键
*******************************************************************************/
Bool Key_SliderCheck(U32 u32KeyVaule)
{
    U8 u8Index = 0;
    
    // 组成滑条的按键个数（包括临近的组合按键）
    static U8 u8HandlerNum = (U8)(ARRAY_SIZE(asKeyValueSliderTab));

    // 查找处理函数
    for(u8Index=0; u8Index<u8HandlerNum; u8Index++)
    {
        if(asKeyValueSliderTab[u8Index].u32KeyValue == u32KeyVaule)
        {
            // 处理滑条
            Key_SliderHandler(asKeyValueSliderTab[u8Index].u8Slider);
            return TRUE;
        }
    }
    
    return FALSE;
}

/***************************** 文件结束 ***************************************/
